/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans.validation;

import beans.util.GeonameWS;
import db.entities.Examination;
import db.entities.Patient;
import hirondelle.date4j.DateTime;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import logger.Log;

/**
 *
 * @author marcy
 */
public class AddExaminations {

    private ArrayList<Object[]> lista;
    private Map<Examination, Boolean> listaSel;
    private int id_pat;
    private String tipo;
    private Date scadenza;
    private String tipo_scadenza;
    private int effettuata = 0;
    private String descrizione;
    private EntityManagerFactory emf;
    private EntityManager em;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    
    

    public String saveExaminations() {


        Iterator<Object[]> i = lista.iterator();
        em.getTransaction().begin();
        id_pat = ((Long) em.createNativeQuery("Select max(p.id) From Patient p").getSingleResult()).intValue();
        Log.getLogger().error("Dentro saveExaminations -> " + id_pat);
        while (i.hasNext()) {
            Object[] ex = i.next();
            em.createNativeQuery("Insert INTO Examination ( id_pat, tipo, scadenza, tipo_scadenza,  descrizione ) "
                    + "VALUES (?,?,?,?,?) ")
                    .setParameter(1, id_pat)
                    .setParameter(2, ex[0])
                    .setParameter(3, ex[1])
                    .setParameter(4, 3)
                    .setParameter(5, ex[2])
                    .executeUpdate();
        }
        em.getTransaction().commit();

        return "success";
    }

    public AddExaminations() {
        emf = Persistence.createEntityManagerFactory("PortaleVisitePU");
        em = emf.createEntityManager();
        id_pat = ((Long) em.createNativeQuery("Select max(p.id) From Patient p").getSingleResult()).intValue();
        Patient p = em.createNamedQuery("Patient.findById", Patient.class).setParameter("id", id_pat).getSingleResult();
        Log.getLogger().error("Dentro costruttore " + id_pat);
        lista = defaultList(p.getDataNascita());

    }

    public String rimuovi(Object[] ex) {
        lista.remove(ex);
        return "ok";
    }

    public String addExamination() {
        Log.getLogger().error("Dentro addExamination");
        Object[] ex = new Object[3];
        ex[0] = tipo;

        DateTime tmp = new DateTime(sdf.format(scadenza));
        ex[1] = tmp.format("YYYY-MM-DD hh:mm");
        ex[2] = descrizione;

        lista.add(ex);
        tipo = null;
        scadenza = null;
        descrizione = null;
        return "ok";
    }

    public String getDescrizione() {
        return descrizione;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    public int getEffettuata() {
        return effettuata;
    }

    public void setEffettuata(int effettuata) {
        this.effettuata = effettuata;
    }

    public int getId_pat() {
        return id_pat;
    }

    public void setId_pat(int id_pat) {
        this.id_pat = id_pat;
    }

    public ArrayList<Object[]> getLista() {
        Log.getLogger().error("Dentro getLista #" + lista.size());
        return lista;
    }

    public void setLista(ArrayList<Object[]> lista) {
        this.lista = lista;
    }

    public Map<Examination, Boolean> getListaSel() {
        return listaSel;
    }

    public void setListaSel(Map<Examination, Boolean> listaSel) {
        this.listaSel = listaSel;
    }

    public Date getScadenza() {
        return scadenza;
    }

    public void setScadenza(Date scadenza) {
        this.scadenza = scadenza;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getTipo_scadenza() {
        return tipo_scadenza;
    }

    public void setTipo_scadenza(String tipo_scadenza) {
        this.tipo_scadenza = tipo_scadenza;
    }
    
    //Funzione per la scaletta dinamica
    private ArrayList<Object[]> defaultList(Date datanascita) {
        ArrayList<Object[]> res = new ArrayList<Object[]>();
        DateTime now = DateTime.now(TimeZone.getDefault());
        String date = sdf.format(datanascita);
        DateTime birth = new DateTime(date);
        DateTime tmp;
        Object[] ex = new Object[3];
        ex[0] = "1";
        ex[2] = "Prima visita obbligatoria per tutti i nuovi pazienti, un anno dopo la registrazione";
        tmp = now.plusDays(365);
        ex[1] = tmp.format("YYYY-MM-DD hh:mm");
        res.add(ex);

        ex = new Object[3];
        ex[0] = "2";
        ex[2] = "Prima vaccinazione obbligatoria contro la malaria, un mese dopo la registrazione";
        tmp = now.plusDays(31);
        ex[1] = tmp.format("YYYY-MM-DD hh:mm");
        res.add(ex);

        ex = new Object[3];
        ex[0] = "2";
        ex[2] = "Richiamo per la vaccinazione contro la malaria, un anno dopo la prima vaccinazione";
        tmp = now.plusDays(386);
        ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
        res.add(ex);

        if (now.lt(birth.plusDays(365))) {

            ex = new Object[3];
            ex[0] = "1";
            ex[2] = "Visita pediatrica obbligatoria un anno dopo la nascita";
            tmp = birth.plusDays(365);
            ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
            res.add(ex);

            ex = new Object[3];
            ex[0] = "2";
            ex[2] = "Prima vaccinazione contro la malaria";
            tmp = birth.plusDays(396);
            ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
            res.add(ex);
        

            ex = new Object[3];
            ex[0] = "2";
            ex[2] = "Richiamo per la vaccinazione contro la malaria";
            tmp = tmp.plusDays(365);
            ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
            res.add(ex);
        }
        
        if (now.lt(birth.plusDays(31))) {
            
            ex = new Object[3];
            ex[0] = "1";
            ex[2] = "Prima visita obbligatoria un mese dopo la nascita";
            tmp = birth.plusDays(31);
            ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
            res.add(ex);

        }
            tmp = birth.plusDays(3);
        /*for (int i = 0; i < 80; i++) {
                
                if(tmp.gteq(now))
                    break;
                tmp = tmp.plusDays(365);
                
            ex = new Object[3];
            ex[0] = "1";
            ex[2] = "Visita annuale programmata";
            ex[1] = tmp.format("YYYY-MM-DD hh:mm:ss");
            res.add(ex);
        }*/


        return res;
    }
}
